 /*******************************************************************************
  * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.texteditor;

 import java.util.HashMap ;
 import java.util.Map ;

 import org.osgi.framework.Bundle;

 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.Platform;

 import org.eclipse.swt.graphics.RGB;

 import org.eclipse.jface.resource.ImageDescriptor;

 import org.eclipse.ui.internal.texteditor.TextEditorPlugin;


 /**
  * An annotation preference provides all the information required for handing
  * the preferences for the presentation of annotations of a specified type. The
  * type can be changed and retrieved using the <code>getAnnotationType</code>
  * and <code>setAnnotationType</code> methods. For each preference, getter and
  * setter methods are provided.
  * <p>
  * Preferences that may be changed by the user also have a corresponding key
  * that can be used to obtain the currently set value from an
  * <code>IPreferenceStore</code>.
  * </p>
  * <h3>The following annotation preferences are covered:</h4>
  * <h4>Display Preferences controlling how and where annotations are shown</h4>
  * <ul>
  * <li>as text background highlighting (and respective preference key),</li>
  * <li>as text decorations (and respective preference key),</li>
  * <li>on the overview ruler (and respective preference key),</li>
  * <li>on the overview ruler header,</li>
  * <li>on the vertical ruler (and respective preference key),</li>
  * </li>
  * </ul>
  * <h4>Additional Display Preferences</h4>
  * <ul>
  * <li>the base color for annotations of this type (and respective preference key),
  * <li>the style of text decorations that are drawn (and respective preference
  * key),</li>
  * <li>the annotation image provider,</li>
  * <li>the quick fix image descriptor,</li>
  * <li>the image descriptor,</li>
  * <li>the symbolic image name,</li>
  * <li>the presentation layer.</li>
  * </ul>
  * <h4>Navigation Preferences</h4>
  * <ul>
  * <li>whether included in the "Go to Next Annotation" navigation action (and
  * respective preference key),</li>
  * <li>whether included in the "Go to Previous Annotation" navigation action
  * (and respective preference key),</li>
  * <li>whether to be shown in the "Go to Next/Previous Annotation" navigation
  * toolbar drop down (and respective preference key).</li>
  * </ul>
  * <h4>Preference Page Preferences</h4>
  * <ul>
  * <li>whether the annotation type should be included on the generic annotation
  * preference page,</li>
  * <li>preference label.</li>
  * </ul>
  *
  * @since 2.1
  */
 public class AnnotationPreference {

     /* String constants for style enumeration */

     /**
      * Constant defining no decoration for the show in text style preference.
      * @since 3.0
      */
     public static final String STYLE_NONE= "NONE"; //$NON-NLS-1$
 /**
      * Constant defining squiggly decoration for the show in text style preference.
      * @since 3.0
      */
     public static final String STYLE_SQUIGGLES= "SQUIGGLES"; //$NON-NLS-1$
 /**
      * Constant defining box decoration for the show in text style preference.
      * @since 3.0
      */
     public static final String STYLE_BOX= "BOX"; //$NON-NLS-1$

     /**
      * Constant defining dashed box decoration for the show in text style preference.
      * @since 3.3
      */
     public static final String STYLE_DASHED_BOX= "DASHED_BOX"; //$NON-NLS-1$

     /**
      * Constant defining underline decoration for the show in text style preference.
      * @since 3.0
      */
     public static final String STYLE_UNDERLINE= "UNDERLINE"; //$NON-NLS-1$
 /**
      * Constant defining i-beam decoration for the show in text style preference.
      * @since 3.0
      */
     public static final String STYLE_IBEAM= "IBEAM"; //$NON-NLS-1$

     /* IDs for presentation preference attributes */

     /**
      * The image to be used for drawing in the vertical ruler.
      * @since 3.0
      */
     protected final static Object IMAGE_DESCRIPTOR= new Object ();
     /**
      * The Quick Fix image to be used for drawing in the vertical ruler.
      * @since 3.2
      */
     protected final static Object QUICK_FIX_IMAGE_DESCRIPTOR= new Object ();
     /**
      * The preference label.
      * @since 3.0
      */
     protected final static Object PREFERENCE_LABEL= new Object ();
     /**
      * The presentation layer.
      * @since 3.0
      */
     protected final static Object PRESENTATION_LAYER= new Object ();
     /**
      * The symbolic name of the image to be drawn in the vertical ruler.
      * @since 3.0
      */
     protected final static Object SYMBOLIC_IMAGE_NAME= new Object ();
     /**
      * Indicates whether the annotation type contributed to the overview ruler's header.
      * @since 3.0
      */
     protected final static Object HEADER_VALUE= new Object ();
     /**
      * The annotation image provider.
      * @since 3.0
      */
     protected final static Object IMAGE_PROVIDER= new Object ();
     /**
      * The value for the includeOnPreferencePage property.
      * @since 3.0
      */
     protected final static Object INCLUDE_ON_PREFERENCE_PAGE= new Object ();

     /* IDs for preference store access and initialization */

     /**
      * The preference key for the visibility inside text.
      * @since 3.0
      */
     protected final static Object TEXT_PREFERENCE_KEY= new Object ();
     /**
      * The visibility inside text.
      * @since 3.0
      */
     protected final static Object TEXT_PREFERENCE_VALUE= new Object ();
     /**
      * The preference key for the presentation color.
      * @since 3.0
      */
     protected final static Object COLOR_PREFERENCE_KEY= new Object ();
     /** The presentation color.
      * @since 3.0
      */
     protected final static Object COLOR_PREFERENCE_VALUE= new Object ();
     /**
      * The preference key for highlighting inside text.
      * @since 3.0
      */
     protected final static Object HIGHLIGHT_PREFERENCE_KEY= new Object ();
     /**
      * The value for highlighting inside text.
      * @since 3.0
      */
     protected final static Object HIGHLIGHT_PREFERENCE_VALUE= new Object ();
     /**
      * The preference key for go to next navigation enablement.
      * @since 3.0
      */
     protected final static Object IS_GO_TO_NEXT_TARGET_KEY= new Object ();
     /**
      * The value for go to next navigation enablement.
      * @since 3.0
      */
     protected final static Object IS_GO_TO_NEXT_TARGET_VALUE= new Object ();
     /**
      * The preference key for go to previous navigation enablement.
      * @since 3.0
      */
     protected final static Object IS_GO_TO_PREVIOUS_TARGET_KEY= new Object ();
     /**
      * The value for go to previous navigation enablement.
      * @since 3.0
      */
     protected final static Object IS_GO_TO_PREVIOUS_TARGET_VALUE= new Object ();
     /**
      * The preference key for the visibility in the vertical ruler.
      * @since 3.0
      */
     protected final static Object VERTICAL_RULER_PREFERENCE_KEY= new Object ();
     /**
      * The visibility in the vertical ruler.
      * @since 3.0
      */
     protected final static Object VERTICAL_RULER_PREFERENCE_VALUE= new Object ();
     /**
      * The preference key for the visibility in the overview ruler.
      * @since 3.0
      */
     protected final static Object OVERVIEW_RULER_PREFERENCE_KEY= new Object ();
     /**
      * The visibility in the overview ruler.
      * @since 3.0
      */
     protected final static Object OVERVIEW_RULER_PREFERENCE_VALUE= new Object ();
     /**
      * The preference key for the visibility in the next/previous drop down toolbar action.
      * @since 3.0
      */
     protected final static Object SHOW_IN_NAVIGATION_DROPDOWN_KEY= new Object ();
     /**
      * The value for the visibility in the next/previous drop down toolbar action.
      * @since 3.0
      */
     protected final static Object SHOW_IN_NAVIGATION_DROPDOWN_VALUE= new Object ();
     /**
      * The preference key for the decoration style.
      * @since 3.0
      */
     protected final static Object TEXT_STYLE_PREFERENCE_KEY= new Object ();
     /**
      * The value for the text decoration style.
      * @since 3.0
      */
     protected final static Object TEXT_STYLE_PREFERENCE_VALUE= new Object ();

     /**
      * Array of all supported attributes.
      * @since 3.0
      */
     protected final static Object [] ATTRIBUTES= new Object [] {
             IMAGE_DESCRIPTOR,
             QUICK_FIX_IMAGE_DESCRIPTOR,
             PREFERENCE_LABEL,
             PRESENTATION_LAYER,
             SYMBOLIC_IMAGE_NAME,
             HEADER_VALUE,
             IMAGE_PROVIDER,
             TEXT_PREFERENCE_KEY,
             TEXT_PREFERENCE_VALUE,
             COLOR_PREFERENCE_KEY,
             COLOR_PREFERENCE_VALUE,
             HIGHLIGHT_PREFERENCE_KEY,
             HIGHLIGHT_PREFERENCE_VALUE,
             IS_GO_TO_NEXT_TARGET_KEY,
             IS_GO_TO_NEXT_TARGET_VALUE,
             IS_GO_TO_PREVIOUS_TARGET_KEY,
             IS_GO_TO_PREVIOUS_TARGET_VALUE,
             VERTICAL_RULER_PREFERENCE_KEY,
             VERTICAL_RULER_PREFERENCE_VALUE,
             OVERVIEW_RULER_PREFERENCE_KEY,
             OVERVIEW_RULER_PREFERENCE_VALUE,
             SHOW_IN_NAVIGATION_DROPDOWN_KEY,
             SHOW_IN_NAVIGATION_DROPDOWN_VALUE,
             TEXT_STYLE_PREFERENCE_KEY,
             TEXT_STYLE_PREFERENCE_VALUE,
             INCLUDE_ON_PREFERENCE_PAGE
     };

     /** The annotation type */
     private Object fAnnotationType;
     /** The marker type */
     private String fMarkerType;
     /** The marker severity */
     private int fSeverity;
     /**
      * The annotation image provider.
      * @since 3.0
      */
     public IAnnotationImageProvider fAnnotationImageProvider;
     /**
      * The configuration element from which to create the annotation image provider.
      * @since 3.0
      */
     public IConfigurationElement fConfigurationElement;
     /**
      * The name of the attribute used to load the annotation image provider
      * from the configuration element.
      * @since 3.0
      */
     public String fAnnotationImageProviderAttribute;
     /**
      * The map of attributes.
      * @since 3.0
      */
     private Map fAttributes= new HashMap ();



     /**
      * Creates a new un-initialized annotation preference. Note that instances
      * with a <code>null</code> annotation type are invalid and should not be
      * used.
      */
     public AnnotationPreference() {
     }

     /**
      * Creates a new annotation preference for the given annotation type.
      *
      * @param annotationType the annotation type
      * @param colorKey the preference key for the presentation color
      * @param textKey the preference key for the visibility inside text
      * @param overviewRulerKey the preference key for the visibility in the
      * overview ruler
      * @param presentationLayer the presentation layer
      */
     public AnnotationPreference(Object annotationType, String colorKey, String textKey, String overviewRulerKey, int presentationLayer) {
         fAnnotationType= annotationType;
         setValue(COLOR_PREFERENCE_KEY, colorKey);
         setValue(TEXT_PREFERENCE_KEY, textKey);
         setValue(OVERVIEW_RULER_PREFERENCE_KEY, overviewRulerKey);
         setValue(PRESENTATION_LAYER, presentationLayer);
     }

     /**
      * Sets the given value for the given attribute.
      *
      * @param attribute the attribute
      * @param value the attribute value
      * @since 3.0
      */
     protected void setValue(Object attribute, Object value) {
         fAttributes.put(attribute, value);
     }

     /**
      * Sets the given value for the given attribute.
      *
      * @param attribute the attribute
      * @param value the attribute value
      * @since 3.0
      */
     protected void setValue(Object attribute, int value) {
         fAttributes.put(attribute, new Integer (value));
     }

     /**
      * Sets the given value for the given attribute.
      *
      * @param attribute the attribute
      * @param value the attribute value
      * @since 3.0
      */
     protected void setValue(Object attribute, boolean value) {
         fAttributes.put(attribute, value ? Boolean.TRUE : Boolean.FALSE);
     }

     /**
      * Returns the value of the given attribute as string.
      *
      * @param attribute the attribute
      * @return the attribute value
      * @since 3.0
      */
     protected String getStringValue(Object attribute) {
         Object value= fAttributes.get(attribute);
         if (value instanceof String )
             return (String ) value;
         return null;
     }

     /**
      * Returns the value of the given attribute as boolean.
      *
      * @param attribute the attribute
      * @return the attribute value
      * @since 3.0
      */
     protected boolean getBooleanValue(Object attribute) {
         Object value= fAttributes.get(attribute);
         if (value instanceof Boolean )
             return ((Boolean ) value).booleanValue();
         return false;
     }

     /**
      * Returns the value of the given attribute as integer.
      *
      * @param attribute the attribute
      * @return the attribute value
      * @since 3.0
      */
     protected int getIntegerValue(Object attribute) {
         Object value= fAttributes.get(attribute);
         if (value instanceof Integer )
             return ((Integer ) value).intValue();
         return 0;
     }

     /**
      * Returns the value of the given attribute.
      *
      * @param attribute the attribute
      * @return the attribute value
      * @since 3.0
      */
     public Object getValue(Object attribute) {
         return fAttributes.get(attribute);
     }

     /**
      * Returns whether the given attribute is defined.
      *
      * @param attribute the attribute
      * @return <code>true</code> if the attribute has a value <code>false</code> otherwise
      * @since 3.0
      */
     public boolean hasValue(Object attribute) {
         return fAttributes.get(attribute) != null;
     }

     /**
      * Returns whether the given string is a preference key.
      *
      * @param key the string to test
      * @return <code>true</code> if the string is a preference key
      */
     public boolean isPreferenceKey(String key) {
         if (key == null)
             return false;

         return key.equals(getStringValue(COLOR_PREFERENCE_KEY)) ||
                 key.equals(getStringValue(OVERVIEW_RULER_PREFERENCE_KEY)) ||
                 key.equals(getStringValue(TEXT_PREFERENCE_KEY)) ||
                 key.equals(getStringValue(HIGHLIGHT_PREFERENCE_KEY)) ||
                 key.equals(getStringValue(TEXT_STYLE_PREFERENCE_KEY)) ||
                 key.equals(getStringValue(VERTICAL_RULER_PREFERENCE_KEY));
     }

     /**
      * Returns the annotation type. Should not be null in a completely set up
      * instance.
      *
      * @return the annotation type, <code>null</code> if the receiver has not
      * been initialized yet
      */
     public Object getAnnotationType() {
         return fAnnotationType;
     }

     /**
      * Returns the marker type.
      *
      * @return the marker type, or <code>null</code> if none is set
      * @deprecated since 3.0
      */
     public String getMarkerType() {
         return fMarkerType;
     }

     /**
      * Returns the marker severity.
      *
      * @return the marker severity
      * @deprecated since 3.0
      */
     public int getSeverity() {
         return fSeverity;
     }

     /**
      * Sets the annotation type. Note that instances with a <code>null</code>
      * annotation type are considered invalid and should not be used with the
      * framework.
      *
      * @param annotationType the annotation type
      */
     public void setAnnotationType(Object annotationType) {
         fAnnotationType= annotationType;
     }

     /**
      * Sets the marker type.
      *
      * @param markerType the marker type
      */
     public void setMarkerType(String markerType) {
         fMarkerType= markerType;
     }

     /**
      * Sets the marker severity.
      *
      * @param severity the marker severity
      */
     public void setSeverity(int severity) {
         fSeverity= severity;
     }

     /**
      * Returns the preference key for the presentation color.
      *
      * @return the preference key for the presentation color or <code>null</code>
      * if none is set
      */
     public String getColorPreferenceKey() {
         return getStringValue(COLOR_PREFERENCE_KEY);
     }

     /**
      * Returns the default presentation color.
      *
      * @return the default presentation color or <code>null</code> if none is
      * set
      */
     public RGB getColorPreferenceValue() {
         return (RGB) getValue(COLOR_PREFERENCE_VALUE);
     }

     /**
      * Returns the presentation string for this annotation type.
      *
      * @return the presentation string for this annotation type or <code>null</code>
      * if none is set
      */
     public String getPreferenceLabel() {
         return getStringValue(PREFERENCE_LABEL);
     }

     /**
      * Returns the preference key for the visibility in the overview ruler.
      *
      * @return the preference key for the visibility in the overview ruler or
      * <code>null</code> if none is set
      */
     public String getOverviewRulerPreferenceKey() {
         return getStringValue(OVERVIEW_RULER_PREFERENCE_KEY);
     }

     /**
      * Returns the default visibility in the overview ruler.
      *
      * @return the default visibility in the overview ruler
      */
     public boolean getOverviewRulerPreferenceValue() {
         return getBooleanValue(OVERVIEW_RULER_PREFERENCE_VALUE);
     }

     /**
      * Returns the preference key for the visibility in the vertical ruler.
      *
      * @return the preference key for the visibility in the vertical ruler or
      * <code>null</code> if none is set
      * @since 3.0
      */
     public String getVerticalRulerPreferenceKey() {
         return getStringValue(VERTICAL_RULER_PREFERENCE_KEY);
     }

     /**
      * Returns the default visibility in the vertical ruler.
      *
      * @return the default visibility in the vertical ruler
      * @since 3.0
      */
     public boolean getVerticalRulerPreferenceValue() {
         return getBooleanValue(VERTICAL_RULER_PREFERENCE_VALUE);
     }

     /**
      * Returns the presentation layer.
      *
      * @return the presentation layer
      */
     public int getPresentationLayer() {
         return getIntegerValue(PRESENTATION_LAYER);
     }

     /**
      * Returns the preference key for the visibility inside text.
      *
      * @return the preference key for the visibility inside text or <code>null</code>
      * if none is set
      */
     public String getTextPreferenceKey() {
         return getStringValue(TEXT_PREFERENCE_KEY);
     }

     /**
      * Returns the default visibility inside text.
      *
      * @return the default visibility inside text
      */
     public boolean getTextPreferenceValue() {
         return getBooleanValue(TEXT_PREFERENCE_VALUE);
     }

     /**
      * Returns the preference key for highlighting inside text.
      *
      * @return the preference key for highlighting inside text or <code>null</code>
      * if none is set
      * @since 3.0
      */
     public String getHighlightPreferenceKey() {
         return getStringValue(HIGHLIGHT_PREFERENCE_KEY);
     }

     /**
      * Returns the default value for highlighting inside text.
      *
      * @return the default value for highlighting inside text
      * @since 3.0
      */
     public boolean getHighlightPreferenceValue() {
         return getBooleanValue(HIGHLIGHT_PREFERENCE_VALUE);
     }

     /**
      * Returns whether the annotation type contributes to the header of the overview ruler.
      *
      * @return <code>true</code> if the annotation type contributes to the header of the overview ruler
      */
     public boolean contributesToHeader() {
         return getBooleanValue(HEADER_VALUE);
     }

     /**
      * Sets the preference key for the presentation color.
      *
      * @param colorKey the preference key
      */
     public void setColorPreferenceKey(String colorKey) {
         setValue(COLOR_PREFERENCE_KEY, colorKey);
     }

     /**
      * Sets the default presentation color.
      *
      * @param colorValue the default color
      */
     public void setColorPreferenceValue(RGB colorValue) {
         setValue(COLOR_PREFERENCE_VALUE, colorValue);
     }

     /**
      * Sets the presentation label of this annotation type.
      *
      * @param label the presentation label
      */
     public void setPreferenceLabel(String label) {
         setValue(PREFERENCE_LABEL, label);
     }

     /**
      * Sets the preference key for the visibility in the overview ruler.
      *
      * @param overviewRulerKey the preference key
      */
     public void setOverviewRulerPreferenceKey(String overviewRulerKey) {
         setValue(OVERVIEW_RULER_PREFERENCE_KEY, overviewRulerKey);
     }

     /**
      * Sets the default visibility in the overview ruler.
      *
      * @param overviewRulerValue <code>true</code> if visible by default, <code>false</code> otherwise
      */
     public void setOverviewRulerPreferenceValue(boolean overviewRulerValue) {
         setValue(OVERVIEW_RULER_PREFERENCE_VALUE, overviewRulerValue);
     }

     /**
      * Sets the preference key for the visibility in the vertical ruler.
      *
      * @param verticalRulerKey the preference key
      * @since 3.0
      */
     public void setVerticalRulerPreferenceKey(String verticalRulerKey) {
         setValue(VERTICAL_RULER_PREFERENCE_KEY, verticalRulerKey);
     }

     /**
      * Sets the default visibility in the vertical ruler.
      *
      * @param verticalRulerValue <code>true</code> if visible by default, <code>false</code> otherwise
      * @since 3.0
      */
     public void setVerticalRulerPreferenceValue(boolean verticalRulerValue) {
         setValue(VERTICAL_RULER_PREFERENCE_VALUE, verticalRulerValue);
     }

     /**
      * Sets the presentation layer.
      *
      * @param presentationLayer the presentation layer
      */
     public void setPresentationLayer(int presentationLayer) {
         setValue(PRESENTATION_LAYER, presentationLayer);
     }

     /**
      * Sets the preference key for the visibility of squiggles inside text.
      *
      * @param textKey the preference key
      */
     public void setTextPreferenceKey(String textKey) {
         setValue(TEXT_PREFERENCE_KEY, textKey);
     }

     /**
      * Sets the default visibility inside text.
      *
      * @param textValue <code>true</code> if visible by default, <code>false</code> otherwise
      */
     public void setTextPreferenceValue(boolean textValue) {
         setValue(TEXT_PREFERENCE_VALUE, textValue);
     }

     /**
      * Sets the preference key for highlighting inside text.
      *
      * @param highlightKey the preference key
      * @since 3.0
      */
     public void setHighlightPreferenceKey(String highlightKey) {
         setValue(HIGHLIGHT_PREFERENCE_KEY, highlightKey);
     }

     /**
      * Sets the default value for highlighting inside text.
      *
      * @param highlightValue <code>true</code> if highlighted in text by default, <code>false</code> otherwise
      * @since 3.0
      */
     public void setHighlightPreferenceValue(boolean highlightValue) {
         setValue(HIGHLIGHT_PREFERENCE_VALUE, highlightValue);
     }

     /**
      * Sets whether the annotation type contributes to the overview ruler's header.
      *
      * @param contributesToHeader <code>true</code> if in header, <code>false</code> otherwise
      */
     public void setContributesToHeader(boolean contributesToHeader) {
         setValue(HEADER_VALUE, contributesToHeader);
     }

     /**
      * Returns the default value for go to next navigation enablement.
      *
      * @return <code>true</code> if enabled by default
      * @since 3.0
      */
     public boolean isGoToNextNavigationTarget() {
         return getBooleanValue(IS_GO_TO_NEXT_TARGET_VALUE);
     }

     /**
      * Sets the default value for go to next navigation enablement.
      *
      * @param isGoToNextNavigationTarget <code>true</code> if enabled by default
      * @since 3.0
      */
     public void setIsGoToNextNavigationTarget(boolean isGoToNextNavigationTarget) {
         setValue(IS_GO_TO_NEXT_TARGET_VALUE, isGoToNextNavigationTarget);
     }

     /**
      * Returns the preference key for go to next navigation enablement.
      *
      * @return the preference key or <code>null</code> if the key is undefined
      * @since 3.0
      */
     public String getIsGoToNextNavigationTargetKey() {
         return getStringValue(IS_GO_TO_NEXT_TARGET_KEY);
     }

     /**
      * Sets the preference key for go to next navigation enablement.
      *
      * @param isGoToNextNavigationTargetKey <code>true</code> if enabled by default
      * @since 3.0
      */
     public void setIsGoToNextNavigationTargetKey(String isGoToNextNavigationTargetKey) {
         setValue(IS_GO_TO_NEXT_TARGET_KEY, isGoToNextNavigationTargetKey);
     }

     /**
      * Returns the default value for go to previous navigation enablement.
      *
      * @return <code>true</code> if enabled by default
      * @since 3.0
      */
     public boolean isGoToPreviousNavigationTarget() {
         return getBooleanValue(IS_GO_TO_PREVIOUS_TARGET_VALUE);
     }

     /**
      * Sets the default value for go to previous navigation enablement.
      *
      * @param isGoToPreviousNavigationTarget <code>true</code> if enabled by default
      * @since 3.0
      */
     public void setIsGoToPreviousNavigationTarget(boolean isGoToPreviousNavigationTarget) {
         setValue(IS_GO_TO_PREVIOUS_TARGET_VALUE, isGoToPreviousNavigationTarget);
     }

     /**
      * Returns the preference key for go to previous navigation enablement.
      *
      * @return the preference key or <code>null</code> if the key is undefined
      * @since 3.0
      */
     public String getIsGoToPreviousNavigationTargetKey() {
         return getStringValue(IS_GO_TO_PREVIOUS_TARGET_KEY);
     }

     /**
      * Sets the preference key for go to previous navigation enablement.
      *
      * @param isGoToPreviousNavigationTargetKey the preference key
      * @since 3.0
      */
     public void setIsGoToPreviousNavigationTargetKey(String isGoToPreviousNavigationTargetKey) {
         setValue(IS_GO_TO_PREVIOUS_TARGET_KEY, isGoToPreviousNavigationTargetKey);
     }

     /**
      * Returns the preference key for the visibility in the next/previous drop down toolbar action.
      *
      * @return the preference key or <code>null</code> if the key is undefined
      * @since 3.0
      */
     public String getShowInNextPrevDropdownToolbarActionKey() {
         return getStringValue(SHOW_IN_NAVIGATION_DROPDOWN_KEY);
     }

     /**
      * Sets the preference key for the visibility in the next/previous drop down toolbar action.
      *
      * @param showInNextPrevDropdownToolbarActionKey the preference key
      * @since 3.0
      */
     public void setShowInNextPrevDropdownToolbarActionKey(String showInNextPrevDropdownToolbarActionKey) {
         setValue(SHOW_IN_NAVIGATION_DROPDOWN_KEY, showInNextPrevDropdownToolbarActionKey);
     }

     /**
      * Returns the default value for the visibility in the next/previous drop down toolbar action.
      *
      * @return <code>true</code> if enabled by default
      * @since 3.0
      */
     public boolean isShowInNextPrevDropdownToolbarAction() {
         return getBooleanValue(SHOW_IN_NAVIGATION_DROPDOWN_VALUE);
     }

     /**
      * Sets the default value for the visibility in the next/previous drop down toolbar action.
      *
      * @param showInNextPrevDropdownToolbarAction <code>true</code> if enabled by default
      * @since 3.0
      */
     public void setShowInNextPrevDropdownToolbarAction(boolean showInNextPrevDropdownToolbarAction) {
         setValue(SHOW_IN_NAVIGATION_DROPDOWN_VALUE, showInNextPrevDropdownToolbarAction);
     }

     /**
      * Sets the preference key for the text style property.
      *
      * @param key the new key
      * @since 3.0
      */
     public void setTextStylePreferenceKey(String key) {
         setValue(TEXT_STYLE_PREFERENCE_KEY, key);
     }

     /**
      * Returns the preference key for the decoration style used when the annotation is shown in text.
      *
      * @return the preference key for the decoration style or <code>null</code> if the key is undefined
      * @since 3.0
      */
     public String getTextStylePreferenceKey() {
         return getStringValue(TEXT_STYLE_PREFERENCE_KEY);
     }

     /**
      * Returns the value for the decoration style used when the annotation is shown in text.
      *
      * @return the value for the decoration style or <code>null</code> if the key is undefined
      * @since 3.0
      */
     public String getTextStyleValue() {
         return getStringValue(TEXT_STYLE_PREFERENCE_VALUE);
     }

     /**
      * Sets the value for the text style property.
      *
      * @param value the new text decoration style
      * @since 3.0
      */
     public void setTextStyleValue(String value) {
         if (!STYLE_NONE.equals(value) && !STYLE_BOX.equals(value) && !STYLE_DASHED_BOX.equals(value)
                 && !STYLE_IBEAM.equals(value) && !STYLE_SQUIGGLES.equals(value)
                 && !STYLE_UNDERLINE.equals(value))
             throw new IllegalArgumentException ();

         setValue(TEXT_STYLE_PREFERENCE_VALUE, value);
     }

     /**
      * Returns the image descriptor for the image to be drawn in the vertical ruler. The provided
      * image is only used, if <code>getAnnotationImageProvider</code> returns <code>null</code>.
      *
      * @return the image descriptor or <code>null</code>
      * @since 3.0
      */
     public ImageDescriptor getImageDescriptor() {
         return (ImageDescriptor) getValue(IMAGE_DESCRIPTOR);
     }

     /**
      * Sets the image descriptor for the image to be drawn in the vertical ruler.
      *
      * @param descriptor the image descriptor
      * @since 3.0
      */
     public void setImageDescriptor(ImageDescriptor descriptor) {
         setValue(IMAGE_DESCRIPTOR, descriptor);
     }

     /**
      * Returns the symbolic name of the image to be drawn in the vertical ruler.
      * The image is only used if <code>getImageDescriptor</code> returns <code>null</code>.
      *
      * @return the symbolic name of the image or <code>null</code>
      * @since 3.0
      */
     public String getSymbolicImageName() {
         return getStringValue(SYMBOLIC_IMAGE_NAME);
     }

     /**
      * Sets the symbolic name of the image to be drawn in the vertical ruler.
      *
      * @param symbolicImageName the symbolic image name
      * @since 3.0
      */
     public void setSymbolicImageName(String symbolicImageName) {
         setValue(SYMBOLIC_IMAGE_NAME, symbolicImageName);
     }

     /**
      * Returns the annotation image provider. If no default annotation image
      * provider has been set, this method checks whether the annotation image
      * provider data has been set. If so, an annotation image provider is
      * created if the configuration element's plug-in is loaded. When an
      * annotation image provider has been created successfully, it is set as
      * the default annotation image provider.
      *
      * @return the annotation image provider
      * @since 3.0
      */
     public IAnnotationImageProvider getAnnotationImageProvider() {
         if (fAnnotationImageProvider == null) {
             if (fConfigurationElement != null && fAnnotationImageProviderAttribute != null) {
                 Bundle bundle= Platform.getBundle( fConfigurationElement.getContributor().getName());
                 if (bundle != null && bundle.getState() == Bundle.ACTIVE) {
                     try {
                         fAnnotationImageProvider= (IAnnotationImageProvider) fConfigurationElement.createExecutableExtension(fAnnotationImageProviderAttribute);
                     } catch (CoreException x) {
                         TextEditorPlugin.getDefault().getLog().log(x.getStatus());
                     }
                 }
             }
         }
         return fAnnotationImageProvider;
     }

     /**
      * Sets the annotation image provider who provides images for annotations
     * of the specified annotation type.
     *
     * @param provider the annotation image provider
     * @since 3.0
     */
    public void setAnnotationImageProvider(IAnnotationImageProvider provider) {
        fAnnotationImageProvider= provider;
        setValue(IMAGE_PROVIDER, provider != null);
    }

    /**
     * Sets the data needed to create the annotation image provider.
     *
     * @param configurationElement the configuration element
     * @param annotationImageProviderAttribute the attribute of the
     * configuration element
     * @since 3.0
     */
    public void setAnnotationImageProviderData(IConfigurationElement configurationElement, String annotationImageProviderAttribute) {
        fConfigurationElement= configurationElement;
        fAnnotationImageProviderAttribute= annotationImageProviderAttribute;
        setValue(IMAGE_PROVIDER, annotationImageProviderAttribute != null);
    }

    /**
     * Sets the property of this annotation preference whether it should be included
     * on the default annotation preference page.
     *
     * @param includeOnPreferencePage the new value
     * @since 3.0
     */
    public void setIncludeOnPreferencePage(boolean includeOnPreferencePage) {
        setValue(INCLUDE_ON_PREFERENCE_PAGE, includeOnPreferencePage);
    }

    /**
     * Returns the property of the receiver of whether it should be included on
     * the default annotation preference page.
     *
     * @return the includeOnPreferencePage property
     * @since 3.0
     */
    public boolean isIncludeOnPreferencePage() {
        Object value= fAttributes.get(INCLUDE_ON_PREFERENCE_PAGE);
        if (value instanceof Boolean )
            return ((Boolean ) value).booleanValue();
        return true;
    }

    /**
     * Merges the values of the given preference into this preference. Existing
     * values will not be overwritten. Subclasses may extend.
     *
     * @param preference the preference to merge into this preference
     * @since 3.0
     */
    public void merge(AnnotationPreference preference) {
        if (!getAnnotationType().equals(preference.getAnnotationType()))
            return;

        for (int i= 0; i < ATTRIBUTES.length; i++) {
            if (!hasValue(ATTRIBUTES[i]))
                setValue(ATTRIBUTES[i], preference.getValue(ATTRIBUTES[i]));
        }

        if (fAnnotationImageProvider == null)
            fAnnotationImageProvider= preference.fAnnotationImageProvider;
        if (fConfigurationElement == null)
            fConfigurationElement= preference.fConfigurationElement;
        if (fAnnotationImageProviderAttribute == null)
            fAnnotationImageProviderAttribute= preference.fAnnotationImageProviderAttribute;
    }

    /**
     * Sets the Quick Fix image descriptor for the image to be drawn in the vertical ruler.
     *
     * @param descriptor the image descriptor
     * @since 3.2
     */
    public void setQuickFixImageDescriptor(ImageDescriptor descriptor) {
        setValue(QUICK_FIX_IMAGE_DESCRIPTOR, descriptor);
    }
    
    /**
     * Returns the Quick Fix image descriptor for the image to be drawn in the vertical ruler. The provided
     * image is only used, if <code>getAnnotationImageProvider</code> returns <code>null</code>.
     *
     * @return the image descriptor or <code>null</code>
     * @since 3.2
     */
    public ImageDescriptor getQuickFixImageDescriptor() {
        return (ImageDescriptor) getValue(QUICK_FIX_IMAGE_DESCRIPTOR);
    }
    
}

